#ifndef __DOG__H__
#define __DOG__H__
#include <stdint.h>
#include "my_utils_support_macro.h"

#include "animal.h"

struct dog_pd_s{
    int weight;
    int age;
};

typedef struct dog_s *dog_t;
struct dog_s{
    struct animal_s;    // 继承animal类, 匿名结构体, 可以直接访问数据
// 公开的操作函数和数据
//   public:
    void (*dog_init)(dog_t v, int arg_num, ...);
    void (*dog_destroy)(dog_t v);
    void (*eat)(dog_t v, int bone);
    void (*get_age)(dog_t v);
    void (*get_weight)(dog_t v);

    // 私有的数据
//    const char    dog_s_pd[DOG_PD_SIZE]; /*私有数据, 不知道具体内容, const修饰后不可直接修改*/
    PRIVATE(dog_s, sizeof(struct dog_pd_s));
};

// 一层封皮, 少了显式传递dog_t指针
#define DEFINE_DOG_METHOD(name) \
static inline void name##__eat(int bone)   \
{   \
    name->eat(name, bone) ;   \
}   \
static inline void name##__get_age(void)   \
{   \
    name->get_age(name) ;   \
}   \
static inline void name##__get_weight(void)    \
{   \
    name->get_weight(name); \
}   \
static inline void name##__run(void)    \
{   \
    name->run((animal_t)name->animal_s_head);    \
}

#define DEFINE_DOG(name, ...)    \
DEFINE_OBJ(struct dog_s, name, dog_init, GET_ARGS(__VA_ARGS__)) \
DEFINE_DOG_METHOD(name) \
DTOR_OBJ(name, dog_destroy)

#define DEFINE_DOG_STATIC(name, ...)    \
DEFINE_OBJ_STATIC(struct dog_s, name, dog_init, GET_ARGS(__VA_ARGS__))  \
DEFINE_DOG_METHOD(name) \
DTOR_OBJ(name, dog_destroy)

#define DEFINE_DOG_AUTO(name, ...)    \
DEFINE_OBJ_AUTO(struct dog_s, name, dog_init, dog_cleanup, GET_ARGS(__VA_ARGS__))


#define NEW_DOG(...)    \
NEW(struct dog_s, dog_init, GET_ARGS(__VA_ARGS__))

#define DELETE_DOG(ptr) \
DELETE(ptr, dog_destroy)

void dog_init(dog_t v, int arg_num, ...);
void dog_destroy(dog_t v);
void dog_cleanup(const void *v);


#endif // __DOG__H__
